package com.mangosteen.interviewji.aop;

import com.jd.platform.hotkey.client.callback.JdHotKeyStore;
import com.mangosteen.interviewji.annotation.HotKeyCheck;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Component
@Aspect
@Slf4j
public class HotKeyInterceptor {

    @Around("@annotation(hotKeyCheck)")
    public Object doHotKeyCheck(ProceedingJoinPoint joinPoint, HotKeyCheck hotKeyCheck) throws Throwable {
        log.info("进入热点缓存切面"+hotKeyCheck.hotKey());
        // 获取方法参数
        Object[] args = joinPoint.getArgs();

        // 获取目标方法上的注解
        String hotKeyPrefix = hotKeyCheck.hotKey();

        // 根据方法参数生成缓存key（这里假设第一个参数有getId()方法）
        String key = generateCacheKey(hotKeyPrefix, args);

        // 检查是否为热key
        boolean isHot = JdHotKeyStore.isHotKey(key);
        log.info("key是否为热key: {}, key: {}", isHot, key);

        // 检查是否为热key
        if (isHot) {
            // 尝试从缓存中获取数据
            Object cachedResult = JdHotKeyStore.get(key);
            if (cachedResult != null) {
                // 如果缓存中有数据，直接返回缓存数据
                log.info("从缓存中获取数据：{}", key);
                return cachedResult;
            }
        }

        // 执行原方法
        log.info("执行原方法：{}", key);
        Object result = joinPoint.proceed();

        // 设置缓存
        JdHotKeyStore.smartSet(key, result);

        return result;
    }

    /**
     * 根据前缀和参数生成缓存key
     * @param prefix 缓存key前缀
     * @param args 方法参数
     * @return 生成的缓存key
     */
    private String generateCacheKey(String prefix, Object[] args) {
        if (args != null && args.length > 0) {
            Object firstArg = args[0];
            if (firstArg != null) {
                try {
                    // 尝试调用getId()方法获取ID
                    Method getIdMethod = firstArg.getClass().getMethod("getId");
                    Object id = getIdMethod.invoke(firstArg);
                    if (id != null) {
                        return prefix + id.toString();
                    }
                } catch (Exception e) {
                    // 如果无法获取ID，使用默认key
                }
            }
        }
        // 默认key
        return prefix + "default";
    }
}
